import { Inject, Injectable } from '@nestjs/common';
import {
  Role,
  RoleModelReturnType,
  CreateRoleDto,
  UpdateRoleDto
} from '../../../../libs/db/src/schemas/role.schemas';
import { QueryRoleDto } from './dto/queryRoleDto';

// 注入Role模型
@Injectable()
export class RoleService {
  constructor(@Inject(Role.name) private readonly role: RoleModelReturnType) {}

  // 创建角色
  create(createRoleDto: CreateRoleDto) {
    return this.role.create(createRoleDto);
  }

  // 查找所有角色
  findAll() {
    return this.role.find();
  }

  /**
   * 根据查询参数分页查询角色
   * @param dto 查询参数
   * @returns
   */
  async pageQuery(dto: QueryRoleDto) {
    // 解构赋值，从dto中获取limit、page、intro、name、createAt
    const { limit, page, name, intro, createAt } = dto;
    // 初始化query为空对象
    const query = {} as any;
    // 如果name存在，则将name添加到query中，使用正则表达式进行模糊匹配，不区分大小写
    if (name) {
      query.name = { $regex: name, $options: 'i' };
    }
    // 如果intro存在，则将intro添加到query中，使用正则表达式进行模糊匹配，不区分大小写
    if (intro) {
      query.intro = { $regex: intro, $options: 'i' };
    }
    // 如果createAt存在，则将createAt添加到query中，使用$gte和$lte进行范围查询
    if (createAt) {
      query.createdAt = {
        $gte: new Date(createAt[0]),
        $lt: new Date(createAt[1])
      };
    }
    // 使用aggregate方法进行查询，统计符合条件的总数
    const total = await this.role.aggregate([
      {
        $match: query
      },
      {
        $count: 'total'
      }
    ]);
    // 使用aggregate方法进行查询，分页查询
    const list = await this.role.aggregate([
      {
        $match: query
      },
      {
        $skip: (page - 1) * limit
      },
      {
        $limit: limit
      }
    ]);
    // 返回查询结果，包括总数和数据
    return {
      total: total[0]?.total || 0,
      list
    };
  }

  // 根据id查找角色
  findOne(id: string) {
    return this.role.findById(id);
  }

  // 更新角色
  update(id: string, updateRoleDto: UpdateRoleDto) {
    return this.role.findByIdAndUpdate(id, updateRoleDto, { new: true });
  }

  // 删除角色
  remove(id: string) {
    return this.role.findByIdAndDelete(id);
  }
}
